/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package categoria;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Alberto
 */
public class RepositorioCategoria implements IRepositorioCategoria {

    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    /**
     * Metodo que ira cadastrar o Categoria
     *
     * @param Categoria objCategoria
     * @return void
     */
    public void cadastrarAtualizar(Categoria objCategoria) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            s.saveOrUpdate(objCategoria);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }

    /**
     * Metodo que ira produrar o Categoria
     *
     * @param int idCategoria
     * @return void
     */
    public Categoria procurar(int idCategoria) throws CategoriaNaoCadastradoException, ErroAcessoRepositorioException {
        Categoria objCategoria = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            objCategoria = (Categoria) s.get(Categoria.class, idCategoria);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new CategoriaNaoCadastradoException();
        }

        return objCategoria;
    }
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<Categoria> procurarPorDescricao(String descricao) throws Exception, ErroAcessoRepositorioException {
        List<Categoria> listCategoria = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            Query q = s.createQuery("from Categoria  WHERE nome like :nome").setString( "nome", "%" + descricao + "%");
            
            // Listando as categorias
            listCategoria = q.list();
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return listCategoria;
    }

    /**
     * Metodo que ira verificar a existência do Categoria
     *
     * @param int idCategoria
     * @return void
     */
    public boolean existe(int idCategoria) throws ErroAcessoRepositorioException {
        Categoria objCategoria = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            objCategoria = (Categoria) s.get(Categoria.class, idCategoria);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
        }

        return (objCategoria != null);
    }

    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<Categoria> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<Categoria> listCategoria = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            // Criando ma query
            Query q = s.createQuery("from Categoria  WHERE id_categoria IS NOT NULL " + strComplemento);

            // Listando as categorias
            listCategoria = q.list();

            // Comtando tudo caso der certo
            t.commit();
        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new Exception(e.getMessage());
        }
        return listCategoria;
    }
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<Categoria> listarAtiva() throws Exception, ErroAcessoRepositorioException {
        String complemento = " AND status_categoria = true ORDER BY id_categoria";
        return this.listar(complemento);
    } 

    /**
     * Método que ira remover o Categoria do banco
     *
     * @param idCategoria
     */
    public void remover(int idCategoria) throws CategoriaNaoCadastradoException, ErroAcessoRepositorioException {
        Categoria objCategoria = null;
        if (this.existe(idCategoria)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();

                // Recupero o meu produto
                objCategoria = (Categoria) s.get(Categoria.class, idCategoria);
                   
                // Atualizando o status da categoria pra falso
                objCategoria.setStatusCategoria(false);
                
                t.commit();
                
                // Atualizo ele pra excluido
                this.cadastrarAtualizar(objCategoria);

            } catch (Exception e) {
                t.rollback();
                //  this.objSession.close();
                throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
            }
            // this.objSession.close();

        } else {
            throw new CategoriaNaoCadastradoException();
        }
    }
}